/*!
 * @file /app/mvp_network.h
 * @date 2025-03-03
 * 
 * Last Edit: 2025-03-03
 * 
 * @author Kong Jiang Feng
 * Contact: kongjiangfeng@macro-video.com
 * Copyright (C) 2025 M@cro-video Technologies Co. All rights reserved
 * 
 * @brief 宏视平台硬件资源使用需适配接口
 * 
 * @note 
 **/

#ifndef __MVP_NETWORK_H__
#define __MVP_NETWORK_H__

#include "mvvcd.h"

#if __cplusplus
extern "C" {
#endif


#pragma region net

#define NET_BUF_LEN      24       ///< 存放ip信息buffer大小
#define DEV_INFO_BUF_LEN 64+1     ///< 存放设备信息buffer大小
#define INVALID_RSSI     (-1000)  ///< 默认返回信号强度值

/** 模块IO使能 **/
typedef enum _module_power_status
{
  MODULE_POWER_DISABLE  = 0,
  MODULE_POWER_ENABLE   = 1,
}MODULE_POWER_STATUS_E;

typedef mv_void_t(*p_module_pwr_ctrl_cb)(MODULE_POWER_STATUS_E status);

typedef enum _eth_status
{
  ETH_DEAFULT = -1,
  /** 以太网卡开关状态 */
  ETH_FLAGS_UP,      
  ETH_FLAGS_DOWN,
  /** 以太网卡链接状态 */
  ETH_LINK_UP,       
  ETH_LINK_DOWN,
}ETH_STATUS_E;

typedef enum _network_mode{
  NETWORK_MODE_NONE        = 0,
  NETWORK_MODE_AP          = 1,
  NETWORK_MODE_STA         = 2,
  NETWORK_MODE_ETH         = 4,
  NETWORK_MODE_MESHLINK    = 8,
  NETWORK_MODE_4G          = 16,
  NETWORK_MODE_BLUETOOTH   = 32,
}NETWORK_MODE_E;

typedef enum _network_operation_stat {
    NETWORK_STAT_UNKNOWN = -1,
    NETWORK_STAT_CONNECTED,
    NETWORK_STAT_UNCONNECTED,
}NETWORK_OPERATION_STAT_E;

/** 模块总线类型 */
typedef enum _module_bus
{
  MODULE_BUS_INVALID = 0,
  MODULE_BUS_USB     = 1,
  MODULE_BUS_SDIO    = 2,
  MODULE_BUS_MAX,
}MODULE_BUS_E;

/** 模块类型 */
typedef enum _module_type
{
  MODULE_UNKNOW = 0,
  MODULE_NONE   =  MODULE_UNKNOW,
  MODULE_ETH_TYPE,

  MODULE_WIFI_TYPE = 100,
  WIFI_RTL8188ETV,
  WIFI_MT7601U   ,
  WIFI_RTL8188FTV,
  WIFI_RTL8192E  ,
  WIFI_RTL8188GTV,
  WIFI_SSW101    ,
  WIFI_ATBM6032I ,
  WIFI_ATBM6132  ,
  WIFI_ATBM6012BX,
  WIFI_ATBM6031  ,
  WIFI_S9083H    ,
  WIFI_SSV6155   ,
  WIFI_SSV6158M  ,
  WIFI_SSV6256   ,
  WIFI_BLM6115XU1,
  WIFI_HI3861L   ,
  WIFI_ATBM6441  ,
  WIFI_AWV821    ,
  WIFI_HI3853    ,

  MODULE_WIFI_NAX   = 200 - 1,
	MODULE_LTE4G_TYPE = 200,
	LTE4G_SE32    , //信位
	LTE4G_M21     , //未出 可删
	LTE4G_ZXM105_D, //新讯 定制
	LTE4G_ZXM105_R,	
	LTE4G_AIR, //合宙
	LTE4G_AIR724UG, 
	LTE4G_AIR780E , 
	LTE4G_AIR_MAX,	
	LTE4G_EC, //移远
	LTE4G_EC200T  , 
	LTE4G_EC200S  ,
	LTE4G_EC801ECN,
	LTE4G_EC800GCN,
	LTE4G_EC800QNA,
	LTE4G_EC600UEU,
	LTE4G_EC_MAX,	
	LTE4G_ZX, //中云信安
	LTE4G_ZX800SG,
	LTE4G_ZX800RG,
	LTE4G_ZX_MAX,	
	MODULE_TYPE_MAX   = 300,
}MODULE_TYPE_E;

typedef enum _mvp_wifi_if_ablc {
    MVP_WIFI_ABLC_UNKNOWN            = 0,
    MVP_NET_FREQ_POINT_NOT_INIT      = 0,
    MVP_NET_FREQ_POINT_2_4G         = 0b1,     /* 2.4G */
    MVP_NET_FREQ_POINT_5_0G         = 0b10,    /* 5.0G */
    MVP_NET_FREQ_POINT_5_2G         = 0b100,   /* 5.2G */
    MVP_NET_FREQ_POINT_5_8G         = 0b1000,  /* 5.8G */
    MVP_WIFI_BLE_SUPPORT             = 0b10000, /* 支持蓝牙 */
}MVP_WIFI_IF_ABLC_E;

typedef enum _mvp_lp_wifi_status {
  MVP_NET_NOT_INIT = 0,
  MVP_NET_STA_CONNECTING,    /* wifi连接中 由模块返回的状态 */
  MVP_NET_STA_DISCONNECT,    /* wifi断开连接 由模块返回的状态，暂时没有这种情况，枚举做预留而已 */
  MVP_NET_STA_CONNECT_FAIL,  /* wifi连接失败 由模块返回的状态 */
  MVP_NET_STA_CONNECT_SUCC,  /* wifi连接成功 由模块返回的状态 */
  MVP_NET_STA_SYNC_SUCC,     /* wifi连接成功(仅同步信息，实际上是休眠唤醒，wifi一直连着的) 由模块返回的状态 */

  MVP_NET_AP_BUILDING,       /* ap建立中 由模块返回的状态 */
  MVP_NET_AP_BUILD_FAIL,     /* ap建立失败 由模块返回的状态 */
  MVP_NET_AP_BUILD_SUCC,     /* ap建立成功 由模块返回的状态 */

  MVP_NET_PING_SUCCESS,      /* ping包成功 由模块返回的状态 */
  MVP_NET_PING_FAILED,       /* ping包失败 由模块返回的状态 */
  MVP_NET_WAIT = 100,        /* 等待模块回复信息 */
}MVP_LP_WIFI_STATUS_E;

typedef enum wifi_reset{
    MVP_LOAD_ONLY_WIFI = 0,   //仅加载 WIFI 驱动 提高带宽
    MVP_LOAD_BLE_WIFI        //加载 BLE + WIFI 驱动 配网
}MVP_WiFi_RESET_E;
typedef struct _lp_wifi_info
{
  mv_s32_t s32_ping_result;
  mv_s32_t s32_wifi_status;
  mv_v8_t  av8_wifi_ip[32];
  mv_v8_t  av8_wifi_gw[32];
  mv_v8_t  av8_wifi_mac[32];
  mv_v8_t  av8_wifi_netmask[32];
}MVP_LP_WIFI_INFO_T;

typedef struct _mvp_net_info
{
  mv_bool_t static_ip_enable;
  mv_v8_t   av8_ipv4     [NET_BUF_LEN]; ///< format:0.0.0.0
  mv_v8_t   av8_gateway  [NET_BUF_LEN];
  mv_v8_t   av8_netmask  [NET_BUF_LEN];
  mv_v8_t   av8_dns_major[NET_BUF_LEN];
  mv_v8_t   av8_dns_minor[NET_BUF_LEN];
  mv_v8_t   av8_mac_str  [NET_BUF_LEN]; ///< format00:00:00:00:00:00
}MVP_NET_INFO_T;

typedef struct _mvp_wifi_info
{
  mv_bool_t             run_flag;           ///< 运行标志
  mv_u32_t              u32_wifi_cur_mode;  ///< <NETWORK_MODE_E> wifi模块当前模式（可以是纯AP/纯STA,也可以AP|BLE共存）
  mv_v8ptr_t            pv8_ifname;         ///< 网卡节点名称
  mv_s32_t              s32_timeout_s;      ///< 连接超时时间(秒)
  mv_s32_t              s32_wifi_status;    ///< hi3861l的网络状态(由模块透传过来的，需要记录，因为mv层需要用到)
  MODULE_TYPE_E         e_module_type;      ///< 模块类型
  p_module_pwr_ctrl_cb  module_power_ctrl;
  mv_v8_t               av8_ssid[DEV_INFO_BUF_LEN];
  mv_v8_t               av8_pwd [DEV_INFO_BUF_LEN];
  MVP_NET_INFO_T        net_info;
  mv_s8_t   ble_support;     //是否支持蓝牙,0 -> 不支持蓝牙, 1 -> 不支持蓝牙
}MVP_WIFI_INFO_T;

#define MVP_WIFI_SCAN_RESULT_MAX  20 ///< 扫描附近ap最大数量

/** 扫描到的ap相关信息 */
typedef struct _mvp_ap_attr
{
	mv_s32_t s32_frequency;              ///< 频率
	mv_s32_t s32_rssi;                   ///< 信号强度
	mv_s32_t s32_flags;
	mv_v8_t  av8_bssid[NET_BUF_LEN];     ///< mac address
	mv_v8_t  av8_ssid[DEV_INFO_BUF_LEN];	///< ssid
	mv_v8_t  av8_flag_desc[128];
}MVP_AP_ATTR_T;

/** 扫描结果 */
typedef struct _mvp_wifi_scan_result
{
	mv_s32_t   s32_total;
	MVP_AP_ATTR_T wifi[MVP_WIFI_SCAN_RESULT_MAX+1];
}MVP_WIFI_SCAN_RESULT_T;

//=============================== [lte4f module] ==============================//
typedef enum mvp_lte4g_err{
    MVP_LTE4G_NO_SIM_CARD         = -28,
    MVP_LTE4G_DIAL_TIMEOUT        = -29,
    MVP_LTE4G_WRITE_ERR           = -30,
    MVP_LTE4G_READ_ERR            = -31,
    MVP_LTE4G_SIM_REGISTER_DENIED = -32,
}MVP_LTE4G_ERR;

typedef mv_s32_t (*p_wait_connect_play_audio_func)(mv_vptr_t arg);
typedef struct _mvp_lte4g_apn_info
{
  mv_v8_t apn[128];     /* apn 最长128 */
  mv_v8_t user[32];     /* apn user 最长32 */
  mv_v8_t pwd[32];      /* apn pwd 最长32 */
  mv_s32_t authmode;    /* authmode 0.无鉴权 1P.AP 2.CHAP */
}MVP_LTE4G_APN_INFO_T;
/** 4G INFO **/
typedef struct _mvp_lte4g_info
{
  mv_bool_t      run_flag;           ///< 运行标志
  mv_v8ptr_t     pv8_ifname;         ///< 网卡节点名称
  // mv_v8ptr_t     pv8_at_dev;         ///< AT设备节点名称
  mv_s32_t       s32_timeout_s;      ///< 连接超时时间(秒)
  MODULE_TYPE_E  e_module_type;      ///< 模块类型
  p_module_pwr_ctrl_cb module_power_ctrl;
  // mv_s32_t    s32_init_flag;      // 模块是否初始化       0:未初始化， 1：已初始化
  // mv_s32_t    s32_sim_status;     // sim卡是否可用        0：不可用， 1：可用
  // mv_s32_t    s32_upload_status;  // 是否处于信息上传状态  0:否    1：是
  MVP_NET_INFO_T net_info;
  mv_v8_t        record_iccid[32];
  mv_bool_t      bl_support_apn_set;
  p_wait_connect_play_audio_func audio_play;
}MVP_LTE4G_INFO_T;

/**
 * @brief  lte4g 资源初始化
 * @param  p4g_info [in] [MVP_LTE4G_INFO_T *]
 * @return 
 * - success : MV_EC_SUCCESS
 * -  failed : <0
 * @note 根据需要实现
 */
mv_s32_t mvp_lte4g_init(MVP_LTE4G_INFO_T *p4g_info);

/**
 * @brief  lte4g 资源反初始化
 * @param  p4g_info [in] [MVP_LTE4G_INFO_T *]
 * @return 
 * - success : MV_EC_SUCCESS
 * -  failed : <0
 * @note 根据需要实现
 */
mv_s32_t mvp_lte4g_uninit(MVP_LTE4G_INFO_T *p4g_info);

/**
 * @brief  lte4g 网络连接
 * @param  p4g_info [in] [MVP_LTE4G_INFO_T *]
 * @return 
 * - success : MV_EC_SUCCESS
 * -  failed : <0
 * @note 根据需要实现
 */
mv_s32_t mvp_lte4g_connect(MVP_LTE4G_INFO_T *p4g_info);

/**
 * @brief  lte4g 设置除模块网关外的备用dns
 * @param  p4g_info [in] [MVP_LTE4G_INFO_T *]
 * @return 
 * - success : MV_EC_SUCCESS
 * -  failed : <0
 * @note 根据需要实现，可空实现
 */
mv_s32_t mvp_lte4g_set_backup_dns(MVP_LTE4G_INFO_T *p4g_info);
/**
 * @brief  lte4g mac 地址获取
 * @param  p4g_info   [in] MVP_LTE4G_INFO_T
 * @return 
 * - success : MV_EC_SUCCESS
 * -  failed : <0
 * @note 根据需要实现
 */
mv_s32_t mvp_lte4g_mac_get(MVP_LTE4G_INFO_T *p4g_info);

/**
 * @brief  lte4g 信号强度
 * @param  p4g_info   [in] MVP_LTE4G_INFO_T
 * @return rssi
 * @note 根据需要实现
 */
mv_s32_t mvp_lte4g_rssi_get(MVP_LTE4G_INFO_T *p4g_info);

/**
 * @brief  获取 4g 网络节点名
 * @param  p4g_info   [in] MVP_LTE4G_INFO_T
 * @note 根据需要实现
 */
mv_v8ptr_t mvp_lte4g_ifname_get(MVP_LTE4G_INFO_T *p4g_info, mv_s32_t has_eth);

/**
 * @brief  获取 4g iccid
 * @param  p4g_info   [in] MVP_LTE4G_INFO_T
 * @note 根据需要实现
 */
mv_s32_t mvp_lte4g_iccid_get(MVP_LTE4G_INFO_T *p4g_info, mv_v8_t iccid[32]);

/**
 * @brief  获取 4g imei
 * @param  p4g_info   [in] MVP_LTE4G_INFO_T
 * @note 根据需要实现
 */
mv_s32_t mvp_lte4g_imei_get(MVP_LTE4G_INFO_T *p4g_info, mv_v8_t imei[32]);

/**
 * @brief  获取 4g imsi
 * @param  p4g_info   [in] MVP_LTE4G_INFO_T
 * @param  imsi       [out]
 * @note 根据需要实现
 */
mv_s32_t mvp_lte4g_imsi_get(MVP_LTE4G_INFO_T *p4g_info, mv_v8_t imsi[32]);

/**
 * @brief  设置 4g apn
 * @param  apn_info   [in] MVP_LTE4G_APN_INFO_T
 * @note 根据需要实现
 */
mv_s32_t mvp_lte4g_apn_set(MVP_LTE4G_APN_INFO_T apn_info);

/**
 * @brief  清除已保存的apn设置
 * @note 根据需要实现
 */
mv_s32_t mvp_lte4g_apn_del();

/**
 * @brief  是否支持cpe
 * @note 直接填0便是
 */
mv_s32_t mvp_lte4g_support_cpe();

/**
 * @brief 获取4g模块版本信息并将结果存储入传入的信息缓冲区内
 * 
 * @param v8p_info_buf 返回的模块版本信息存储缓冲区
 * @param s32_buf_len  缓冲区长度
 */
mv_s32_t mvp_lte4g_get_ati_info(mv_v8ptr_t v8p_info_buf, mv_s32_t s32_buf_len);

/**
 * @brief 获取4g模块所属的厂商信息
 * 
 * @return 
 * - success : LTE4G_AIR， LTE4G_EC， LTE4G_ZX
 * -  failed : 4G模块枚举
 * @note 根据需要实现
 */
mv_s32_t mvp_lte4g_get_manufacturer(mv_void_t);

/**
 * @brief 获取模块现有的接入点信息
 * @return 
 * @note 根据需要实现
 */
mv_s32_t mvp_lte4g_get_apn_info(mv_void_t);

/**
 * @brief  恢复usb通信
 * @param  p4g_info   [in] MVP_LTE4G_INFO_T
 * @note   根据需要实现
 */
mv_s32_t mvp_lte4g_uhc_open(MVP_LTE4G_INFO_T *p4g_info);

/**
 * @brief  关闭usb通信
 * @param  p4g_info   [in] MVP_LTE4G_INFO_T
 * @note   根据需要实现
 */
mv_s32_t mvp_lte4g_uhc_exit(MVP_LTE4G_INFO_T *p4g_info);
//=============================== [wlan module] ==============================//

/**
 * @brief  检查模块前的相关资源初始化
 * @param  cb [in] 电源控制回调
 */
mv_s32_t mvp_module_type_check_init(p_module_pwr_ctrl_cb cb);

/**
 * @brief  检查模块前的相关资源反初始化
 * @param  cb [in] 电源控制回调
 */
mv_s32_t mvp_module_type_check_uninit(p_module_pwr_ctrl_cb cb);

/**
 * @brief  检查USB连接模块类型
 * @return MODULE_TYPE_E 
 * @note   根据枚举出来的 usb id 返回对应类型。
 */
mv_s32_t mvp_module_type_check(mv_u8_t u8_mod_bus);

/**
 * @brief  wifi 资源初始化
 * @param  pwifi_info [in] [MVP_WIFI_INFO_T *]
 * @return 
 * - success : MVVCD_EC_SUCCESS
 * -  failed : MVVCD_EC_FAILED
 * @note 根据需要实现
 */
mv_s32_t mvp_wifi_init(MVP_WIFI_INFO_T *pwifi_info);

/**
 * @brief  wifi 资源反初始化
 * @param  pwifi_info [in] [MVP_WIFI_INFO_T *]
 * @return 
 * - success : MVVCD_EC_SUCCESS
 * -  failed : MVVCD_EC_FAILED
 * @note 根据需要实现
 */
mv_s32_t mvp_wifi_uninit(MVP_WIFI_INFO_T *pwifi_info);

/**
 * @brief  wifi mac 地址获取
 * @param  pwifi_info [in] [MVP_WIFI_INFO_T *]
 * @return 
 * - success : MVVCD_EC_SUCCESS
 * -  failed : < 0
 * @note 根据需要实现
 */
mv_s32_t mvp_wifi_mac_get(MVP_WIFI_INFO_T *pwifi_info);

/**
 * @brief  wifi station 模式开启
 * @param  pwifi_info [in] [MVP_WIFI_INFO_T *]
 * @return 
 * - success : MVVCD_EC_SUCCESS
 * -  failed : MVVCD_EC_FAILED
 * @note 
 */
mv_s32_t mvp_wifi_sta_start(MVP_WIFI_INFO_T *pwifi_info);

/**
 * @brief  wifi station 模式关闭
 * @param  pwifi_info [in] [MVP_WIFI_INFO_T *]
 * @return 
 * - success : MVVCD_EC_SUCCESS
 * -  failed : MVVCD_EC_FAILED
 * @note 
 */
mv_s32_t mvp_wifi_sta_stop(MVP_WIFI_INFO_T *pwifi_info);

/**
 * @brief  wifi ap 模式开启
 * @param  pwifi_info [in] [MVP_WIFI_INFO_T *]
 * @return 
 * - success : MVVCD_EC_SUCCESS
 * -  failed : MVVCD_EC_FAILED
 * @note 
 */
mv_s32_t mvp_wifi_ap_start(MVP_WIFI_INFO_T *pwifi_info);

/**
 * @brief  wifi ap 模式关闭
 * @param  pwifi_info [in] [MVP_WIFI_INFO_T *]
 * @return 
 * - success : MVVCD_EC_SUCCESS
 * -  failed : MVVCD_EC_FAILED
 * @note 
 */
mv_s32_t mvp_wifi_ap_stop(MVP_WIFI_INFO_T *pwifi_info);

/**
 * @brief  获取设备ap被其他设备连接个数
 * @return 
 * - success : 连接设备ap数量
 * -  failed : MVVCD_EC_FAILED
 * @note 
 */
mv_s32_t mvp_wifi_ap_connect_num_get();

/**
 * @brief  wifi 扫描附近热点
 * @param  pwifi_info  [in]  [MVP_WIFI_INFO_T *]
 * @param  p_list      [out] [MVP_WIFI_SCAN_RESULT_T *]
 * @param  s32_max_num [in]  最大扫描数目
 * @return 
 * - success : MVVCD_EC_SUCCESS
 * -  failed : MVVCD_EC_FAILED
 * @note 
 */
mv_s32_t mvp_wifi_scan_result_get(MVP_WIFI_INFO_T *pwifi_info, MVP_WIFI_SCAN_RESULT_T *p_list, mv_s32_t s32_max_num);

/**
 * @brief 获取 wifi 信号强度
 * @return 
 * - success : rssi(db)
 * -  failed : INVALID_RSSI
 * @note 
 */
mv_s32_t mvp_wifi_rssi_get();

/**
 * @brief 返回 wifi 模块支持的属性
 * @return <mv_u32_t> 
 * - success : wifi ablc(MVP_WIFI_IF_ABLC_E)
 * - failed  : MVP_WIFI_ABLC_UNKNOWN
 */
mv_u32_t mvp_wifi_properties_get(mv_void_t);

/**
 * @brief  wifi 驱动动态重载
 * @param  mode [in] [MVP_WiFi_RESET_E]
 * @return 
 * - success : MVVCD_EC_SUCCESS
 * -  failed : MV_EC_NOT_SUPPORT
 * @note 根据需要实现
 */
mv_s32_t mvp_wifi_reset(mv_u8_t mode);

/**
 * @brief 返回支持的网络频段
 * 
 * @return mv_s32_t 
 */
mv_s32_t mvp_freq_point_get(mv_void_t);

//=============================== [ether] ==============================//
typedef struct _eth_info
{
  mv_bool_t      run_flag;        ///< 运行标志
  mv_v8ptr_t     pv8_ifname;      ///< 网卡节点名称
  mv_s32_t       s32_timeout_s;   ///< 连接超时时间(秒)
  MVP_NET_INFO_T net_info;
}MVP_ETH_INFO_T;

/**
  * @brief   检查以太网卡芯片状态
  * @return     
  * - success : MVVCD_EC_SUCCESS
  * -  failed : < 0
  */
mv_s32_t mvp_ether_dev_check();

/**
 * @brief  以太网口检测网线插拔状态
 * @return 
 * - success : [ETH_LINK_UP/ETH_LINK_DOWN]
 * -  failed : -1 
 */
mv_s32_t mvp_ether_link_status_check();

/**
 * @brief 以太网口检测网线插拔重新初始化
 */
mv_void_t mvp_ether_link_status_check_restart();

/**
  * @brief   设置以太网卡状态 
  * @param   pv8_ifname [in] ex:eth0
  * @param   s32_flag   [in] [ETH_FLAGS_UP/ETH_FLAGS_DOWN]
  * @return  
  * - success : MVVCD_EC_SUCCESS
  * -  failed : < 0
  */
mv_s32_t mvp_ether_flag_set(mv_v8ptr_t pv8_ifname, mv_s32_t s32_flag);

/**
 * @brief  以太网卡连接,获取IP
 * @param  pnetinfo   [in] net info
 * @return 
 * - success : MVVCD_EC_SUCCESS
 * -  failed : MVVCD_EC_FAILED
 * @note 
 */
mv_s32_t mvp_ether_connect(MVP_ETH_INFO_T *peth_info);

/**
 * @brief  以太网卡断开连接
 * @param  peth_info [in] net info
 * @return 
 * - success : MVVCD_EC_SUCCESS
 * -  failed : MVVCD_EC_FAILED
 * @note 
 */
mv_s32_t mvp_ether_disconnect(MVP_ETH_INFO_T *peth_info);

/**
 * @brief  以太网卡MAC获取
 * @param  peth_info [in] net info
 * @return 
 * - success : MVVCD_EC_SUCCESS
 * -  failed : < 0
 * @note 
 */
mv_s32_t mvp_ether_mac_get(MVP_ETH_INFO_T *peth_info);

/**
 * @brief  以太网卡MAC设置
 * @param  peth_info [in] net info
 * @return 
 * - success : MVVCD_EC_SUCCESS
 * -  failed : < 0
 * @note 
 */
mv_s32_t mvp_ether_mac_set(MVP_ETH_INFO_T *peth_info);

//=============================== [mvp_ble] ==============================//
/**
 * 设置当前广播状态 
 */
typedef enum _mvp_ble_gap_adv_scan_status{
	MVP_BLE_ADV_SCAN_STATUS_IDLE = 0,
	MVP_BLE_GAP_STATUS_SCAN_START,
	MVP_BLE_GAP_STATUS_ADV_START,
	MVP_BLE_GAP_STATUS_ADV_RESUME,
	MVP_BLE_GAP_STATUS_CONNECT,
	MVP_BLE_GAP_STOP_DISCONNECT,
	
  MVP_BLE_GAP_ADVERTISING_SUCCESS,
	MVP_BLE_GAP_ADVERTISING_ERROR,
	MVP_BLE_GAP_STATUS_MAX,
}MVP_BLE_GAP_ADV_SCAN_STATUS_E;

typedef enum ble_com{
    MVP_BLE_WIFI_NOT_COEXISTENCE = 0,   //不支持 BLE WIFI 共存
    MVP_BLE_WIFI_COEXISTENCE           //支持 BLE WIFI 共存
}MVP_BLE_COM_E;

typedef mv_s32_t(*pf_ble_recv_result_cb)(mv_vptr_t pv_data, mv_s32_t s32_len, mv_vptr_t arg);

/**
 * @brief 蓝牙协议栈初始化
 * @return 0:success
 */
mv_s32_t mvp_ble_stack_init(mv_void_t);
/**
 * @brief exit + release
 * @param  
 * @return 0:success
 */
mv_s32_t mvp_ble_stack_uninit(mv_void_t);
/**
 * @brief 蓝牙发送接口
 * @param [in] pu8_data 
 * @param [in] max_wait_time 等待发送的最大时间，超过该时间则退出等待，单位为100ms
 * @return 0:SUCCESS
 */
mv_s32_t mvp_ble_send_data(mv_u8ptr_t pu8_data, mv_s32_t s32_len, mv_s32_t max_wait_time);
/**
 * @brief 设置蓝牙名称
 * @param [in] ble_name 
 * @param [in] len 
 * @return 0:SUCCESS
 */
mv_s32_t mvp_ble_set_device_name(mv_v8ptr_t ble_name, mv_s32_t len);
/**
 * @brief 获取蓝牙地址
 * @param [out] ble_addr 
 */
mv_s32_t mvp_get_ble_addr(mv_s8ptr_t ble_addr);
/**
 * @brief 设置广播状态
 * @param [in] status MVP_BLE_GAP_ADV_SCAN_STATUS_E
 * @return 0:SUCCESS
 */
mv_s32_t mvp_ble_set_gap_adv_status(mv_s32_t status);
/**
 * @brief 获取当前广播状态
 * @param [out] pu8_status MVP_BLE_GAP_ADV_SCAN_STATUS_E 
 * @return 0:SUCCESS
 */
mv_s32_t mvp_ble_get_gap_adv_status(mv_u8ptr_t pu8_status);
/**
 * @brief 扫描指定蓝牙名称，扫描到了主动连接
 * @param [in] pv8_ble_name 蓝牙名称 
 * @return 
 *    - MV_EC_SUCCESS ： 开启扫描成功
 *    - errno ： 开启扫描失败
 * @note 连接是否成功需搭配“mvp_ble_get_gap_adv_status”函数获取，函数返回结果仅是扫描开启是否成功
 */
mv_s32_t mvp_ble_scan_active(mv_v8ptr_t pv8_ble_name);
/**
 * @brief 停止蓝牙扫描
 * @return 0:success
 */
mv_s32_t mvp_ble_scan_deactivate(mv_void_t);
/**
 * @brief 获取蓝牙mtu大小
 * @return 
 */
mv_u32_t mvp_ble_get_mtu_size(mv_void_t);
/**
 * @brief 接收蓝牙信息回调初始化
 * @param [in] mvp_ble_recv_data_cb 
 * @return 0:success 
 */
mv_s32_t mvp_ble_get_data_callback_init(pf_ble_recv_result_cb mvp_ble_recv_data_cb);
/**
 * @brief  WiFi与 BLE共存标志位获取
 * @return （0=不支持；1=支持）
 */
mv_u8_t mvp_ble_com_get(mv_void_t);
#pragma endregion net

#if __cplusplus
}
#endif

#endif